/*
 * To change this template, choo

            @Override
            public Lookup getLookup() {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        }e Tools | Templates
 * and open the template in the editor.
 */
package org.knolle.vistas;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.io.IOException;
import org.knolle.campanias.util.ActividadesTableModel;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.swing.*;
import org.knolle.interfaces.ConstantsInterface;
import org.marcelo.agro.actions.AgroConstantsActions;
import org.marcelo.agro.core.api.InterfaceActividades;
import org.marcelo.agro.core.DynamicLookup;
import org.marcelo.agro.core.EntitiesJXTable;
import org.marcelo.agro.core.PopupMenuListener;
import org.marcelo.agro.entidades.Actividades;
import org.marcelo.agro.entidades.Campanas;
import org.marcelo.agro.entidades.LotesPorCampana;
import org.netbeans.api.actions.Editable;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.util.Lookup;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
import org.openide.windows.TopComponent;
import org.openide.util.NbBundle.Messages;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
import org.openide.windows.WindowManager;

/**
 * Top component which displays something.
 */
@ConvertAsProperties(dtd = "-//org.knolle.vistas//Actividades//EN",
autostore = false)
@TopComponent.Description(preferredID = "ActividadesTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE", 
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "editor", openAtStartup = false)
@ActionID(category = "Window", id = "org.knolle.vistas.ActividadesTopComponent")
@ActionReference(path = "Menu/Campañas" , position = 1200)
@TopComponent.OpenActionRegistration(displayName = "#CTL_ActividadesAction",
preferredID = "ActividadesTopComponent")
@Messages({
    "CTL_ActividadesAction=Actividades",
    "CTL_ActividadesTopComponent=Actividades Window",
    "HINT_ActividadesTopComponent=This is a Actividades window"
})
public final class ActividadesTopComponent extends TopComponent implements LookupListener,Editable {
    
    //Lista de Lookups //
    private Lookup.Result result = null;
    private Lookup.Result result2 = null;
    private InstanceContent content = new InstanceContent();
    
    //Fin Lookups
    
//    Lista Table Model
    private ActividadesTableModel actividadesTableModel = new ActividadesTableModel();
//    Fin Table Model
    
     InterfaceActividades ia = Lookup.getDefault().lookup(InterfaceActividades.class);   
    
//    Acciones de la ventana
    private AbstractAction accionEditar;
    private AbstractAction accionNuevo;
    private AbstractAction accionRecargar;
    private AbstractAction accionBorrar;
//     Fin de las acciones
    
//    Lista de variables estaticas
    final static String VENTANA_LOOKUP= "VistaCampanhasTopComponent";
    final static Integer DOBLE_CLICK = 2;
    final static Integer BOTON_DERECHO = MouseEvent.BUTTON3;
    private static Campanas campania;
    private static LotesPorCampana lpc;
//    fin variables estaticas
    
    /**
     * Metodo para inicializar las acciones
     */
    
    private void iniciarAcciones() {
        
        accionNuevo = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                AgregarActividadController aac = new AgregarActividadController();
                aac.showPanel();
                recargarTabla();
            }
        
        };
        
        accionEditar = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                editarFila();
                recargarTabla();
            }
        };
        
        accionBorrar = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                borrarDatos();
                recargarTabla();
            }
        };
        
        accionRecargar = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                recargarTabla();
            }
        };
    }
    
    void iniciarTabla(){
        /**
         * Obtener los keyStroke para F2 y Para Borrado
         * Obtener el Key Stroke para enter tambien
         */
        jXTable1.setModel(actividadesTableModel);
        
        jXTable1.addMouseListener(new PopupMenuListener(jPopupMenu1,jXTable1));
        
        ActionMap actionMap = jXTable1.getActionMap();
        actionMap.put(ConstantsInterface.DELETE, accionBorrar);
        actionMap.put(ConstantsInterface.EDIT, accionEditar);
        actionMap.put(ConstantsInterface.REFRESH, accionRecargar);
        
    }
    
    public ActividadesTopComponent() {
        iniciarAcciones();
        initComponents();
        setName(Bundle.CTL_ActividadesTopComponent());
        setToolTipText(Bundle.HINT_ActividadesTopComponent());
        iniciarTabla(); 
        getActionMap().put(AgroConstantsActions.NEW_ACTION, accionNuevo); 
        getActionMap().put(AgroConstantsActions.REFRESH_ACTION, accionRecargar); 
        associateLookup(DynamicLookup.getDefault());
//        associateLookup(Lookups.fixed(jXTable1, getActionMap()));
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPopupMenu1 = new javax.swing.JPopupMenu();
        menuNuevo = new javax.swing.JMenuItem(accionNuevo);
        menuEditar = new javax.swing.JMenuItem(accionEditar);
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        menuBorrar = new javax.swing.JMenuItem(accionBorrar);
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        menuRecargar = new javax.swing.JMenuItem(accionRecargar);
        jScrollPane2 = new javax.swing.JScrollPane();
        jXTable1 = new EntitiesJXTable();
        lblTotalActividades = new javax.swing.JLabel();
        jSeparator3 = new javax.swing.JSeparator();
        lblTotalInversion = new javax.swing.JLabel();
        lblTotalGastoUnidadSuperficie = new javax.swing.JLabel();

        menuNuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/marcelo/agro/campanias/recursos/blue_plus_24x24.png"))); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(menuNuevo, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.menuNuevo.text")); // NOI18N
        jPopupMenu1.add(menuNuevo);

        menuEditar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/marcelo/agro/campanias/recursos/Edit_24x24.png"))); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(menuEditar, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.menuEditar.text")); // NOI18N
        jPopupMenu1.add(menuEditar);
        jPopupMenu1.add(jSeparator1);

        menuBorrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/marcelo/agro/campanias/recursos/Trash.png"))); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(menuBorrar, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.menuBorrar.text")); // NOI18N
        jPopupMenu1.add(menuBorrar);
        jPopupMenu1.add(jSeparator2);

        menuRecargar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/marcelo/agro/campanias/recursos/Refresh.png"))); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(menuRecargar, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.menuRecargar.text")); // NOI18N
        jPopupMenu1.add(menuRecargar);

        //mostrar menu desplegable

        jXTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jXTable1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jXTable1MouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(jXTable1);

        org.openide.awt.Mnemonics.setLocalizedText(lblTotalActividades, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.lblTotalActividades.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(lblTotalInversion, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.lblTotalInversion.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(lblTotalGastoUnidadSuperficie, org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.lblTotalGastoUnidadSuperficie.text")); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 454, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblTotalActividades)
                        .addGap(18, 18, 18)
                        .addComponent(lblTotalInversion)
                        .addGap(18, 18, 18)
                        .addComponent(lblTotalGastoUnidadSuperficie)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addComponent(jSeparator3))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 416, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(4, 4, 4)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTotalActividades)
                    .addComponent(lblTotalInversion)
                    .addComponent(lblTotalGastoUnidadSuperficie))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void jXTable1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jXTable1MouseClicked
        // TODO add your handling code here:
        if (jXTable1.getSelectedRow() != -1) {
            int j = jXTable1.convertRowIndexToModel(jXTable1.getSelectedRow());
            Actividades act = (Actividades)actividadesTableModel.getList().get(j);
            DynamicLookup.getDefault().setSingleton(act);        
        }
        if (evt.getButton() != BOTON_DERECHO) {
            if ( evt.getClickCount() == DOBLE_CLICK && jXTable1.getSelectedRow() != -1 ) {
                editarFila();
            }
        }
    }//GEN-LAST:event_jXTable1MouseClicked

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPopupMenu jPopupMenu1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JSeparator jSeparator3;
    private org.jdesktop.swingx.JXTable jXTable1;
    private javax.swing.JLabel lblTotalActividades;
    private javax.swing.JLabel lblTotalGastoUnidadSuperficie;
    private javax.swing.JLabel lblTotalInversion;
    private javax.swing.JMenuItem menuBorrar;
    private javax.swing.JMenuItem menuEditar;
    private javax.swing.JMenuItem menuNuevo;
    private javax.swing.JMenuItem menuRecargar;
    // End of variables declaration//GEN-END:variables
    @Override
    public void componentOpened() {
        // TODO add custom code on component opening
        result = WindowManager.getDefault().findTopComponent(VENTANA_LOOKUP).getLookup().lookupResult(LotesPorCampana.class);
        result2 = WindowManager.getDefault().findTopComponent(VENTANA_LOOKUP).getLookup().lookupResult(Campanas.class);
        result.addLookupListener(this);
        result2.addLookupListener(this);
        resultChanged(new LookupEvent(result));
        resultChanged(new LookupEvent(result2));
    }

    @Override
    public void componentClosed() {
        // TODO add custom code on component closing
        result.removeLookupListener(this);
        result2.removeLookupListener(this);
        result = null;
        result2 = null;
    }

    void writeProperties(java.util.Properties p) {
        // better to version settings since initial version as advocated at
        // http://wiki.apidesign.org/wiki/PropertyFiles
        p.setProperty("version", "1.0");
        // TODO store your settings
    }

    void readProperties(java.util.Properties p) {
        String version = p.getProperty("version");
        // TODO read your settings according to their version
    }

    @Override
    public void resultChanged(LookupEvent le) {
        //Aca obtengo los datos
        //Hago la consulta y muestro los datos en la tabla
        Lookup.Result r = (Lookup.Result) le.getSource();
        
        Collection<? extends LotesPorCampana> lotesPorCampanas=null;
        Collection<? extends Campanas> listCampanias=null;
       
        if (r.equals(result)) {
             lotesPorCampanas =  r.allInstances();
             if (lotesPorCampanas != null) {
               for (LotesPorCampana lotesPorCampana : lotesPorCampanas) {
                   setName("Actividades en: " +lotesPorCampana.getLotes().getNombre());
                   lpc = lotesPorCampana;
                   if (campania != null)
                       DynamicLookup.getDefault().remove(campania);
                   DynamicLookup.getDefault().setSingleton(lpc);
               }
               recargarTabla();
            }
        }
        else if (r.equals(result2)){
           listCampanias =  r.allInstances();
           if (listCampanias != null){
               for (Campanas c : listCampanias) {
                   setName("Actividades en: " +c.getNombre()); 
                   campania = c;
                   DynamicLookup.getDefault().setSingleton(c);
                   if (lpc != null)
                       DynamicLookup.getDefault().remove(lpc);
                   lpc = null;
               }
               recargarTabla();
           }
        }        
    }
    
    /**
     * MEtodo para seleccionar una fila y editarla
     * 
     */
    private void editarFila() {
        int i = jXTable1.getSelectedRow() ;
        //Por si se ordena
        int j = jXTable1.convertRowIndexToModel(i);
//                Chequear Index
        if (j >= 0 )
        {
            Actividades actividad = (Actividades) actividadesTableModel.getList().get(j);          
            PanelAgregarActividades atp = new PanelAgregarActividades(actividad);
            DialogDescriptor dd = new DialogDescriptor(atp, "Editar Actividad", true, atp);
            DialogDisplayer.getDefault().notify(dd);
        }
    }

    private void recargarTabla() {
        
        final List<Actividades> listaActividades ;
        if (lpc != null) {
            listaActividades = ia.getActividades(lpc);
        }
        else {
            listaActividades = ia.getActividades(campania);
        }
        if (listaActividades != null){
            actividadesTableModel.getList().clear();
            actividadesTableModel.getList().addAll(listaActividades);
            actividadesTableModel.fireTableDataChanged();   
        }
        //Aca crear un runable para que cargue los datos al finalizar los calculos
        //Lo interesante seria tener una clase que se encargue de loos calculos
        //ya que son varias cosas, primero saber la superficie en cuestion
        //pasar todo a una misma unidad de medida
        //
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                
                long total=0l;
                for (Actividades act:listaActividades) {
                     total += act.getDosis().multiply(act.getSuperficie().multiply(act.getPrecioUnitario())).longValue();
                }
                //Setear los campos
                lblTotalActividades.setText(org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.lblTotalActividades.text")+listaActividades.size()) ;
                lblTotalInversion.setText(org.openide.util.NbBundle.getMessage(ActividadesTopComponent.class, "ActividadesTopComponent.lblTotalInversion.text")+total);
                
            }
        });
        
        
        
    }
    
    /**
     * Metodo para borrar todos los objetos seleccionados en la tabla
     */
    private void borrarDatos() {
          int cantidadErrores = 0;
//        Alertar al usuario de lo que va hacer
          NotifyDescriptor nd = new NotifyDescriptor.Confirmation("En realidad desea borrar estos elementos","Accion de Borrado");
          if (DialogDisplayer.getDefault().notify(nd) == DialogDescriptor.YES_OPTION) 
//        obtener la lista de objetos a borrar
          {
              int[] indices =jXTable1.getSelectedRows() ;
              for (int i = 0 ;i < indices.length ; i++){
//        convertir los indice en model, por si se ordeno la tabla
                  int j = jXTable1.convertRowIndexToModel(indices[i]);
//                  obtener el objeto en la posicion
                   Actividades actividad = (Actividades) actividadesTableModel.getList().get(j);
//        proceder a borrar en un bloque try,
                   try{
                       ia.delete(actividad);
                   }
//        contar la catidad de elementos borrados
                   catch(IOException ioe) {
                       cantidadErrores ++;
                   }
                  
              }
//              Si se produjo errores mostrar los errores
              if(cantidadErrores > 0 ) {
                  nd = new NotifyDescriptor.Message("No se borraron : "+ cantidadErrores +", por errores.");
                  DialogDisplayer.getDefault().notify(nd);
              }
          }
        
        
    }

    @Override
    public void edit() {
        editarFila();
    }

    
}
